﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using JasRibbonApplicatie.Classes;
using Microsoft.Win32;
using System.Threading.Tasks;
using System.Threading;
using JasRibbonApplicatie.Model;

namespace JasRibbonApplicatie.Views
{
    /// <summary>
    /// Interaction logic for MateriaalOmschrijving.xaml
    /// </summary>
    public partial class MateriaalOmschrijving : Page
    {

        public MateriaalOmschrijving()
        {
            InitializeComponent();
            Page currentPage = Login.Instance.MainWindowReference.currentPage;
            if (currentPage is BeheerMateriaal)
            {
                var item = (currentPage as BeheerMateriaal).materiaalTreeView.SelectedItem;
                if(item is Materiaaltype)
                    this.OmschrijvingMateriaal(item as Materiaaltype);
            }
        }
        private String URL = Properties.Settings.Default.HTTP_BASEPATH;
        private static MateriaalModel mm = new MateriaalModel();

        public void OmschrijvingMateriaal(Materiaaltype materiaal)
        {
            detailsGrid.DataContext = materiaal;
            afbeeldingListBox.SelectedIndex = 0;
        }
        
        private void saveButton_Click(object sender, RoutedEventArgs e)
        {
            mm.OpslaanWijzigingen();
        }

        private void afbeeldingListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string path = "";
            productImage.Source = null;
            string afb = "";
            if (detailsGrid.DataContext is Materiaaltype)
                afb = ((Materiaaltype)detailsGrid.DataContext).afbeelding;
            else if (detailsGrid.DataContext is ToebehorenType)
                afb = ((ToebehorenType)detailsGrid.DataContext).afbeelding;

            if (afb != "")
            {
                if (afb.IndexOf(';') == -1 || afbeeldingListBox.SelectedIndex ==-1) path = URL + afb;
                else path = URL + afb.Split(';')[afbeeldingListBox.SelectedIndex];

                productImage.Source = new ImageSourceConverter().ConvertFromString(path) as ImageSource;

            }
            else productImage.Source = null;
        }

        private void addafbeeldingButton_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Kies een afbeelding";
            ofd.InitialDirectory = @"C:\";
            ofd.Filter = "Afbeeldingen (*.jpg, *.png)|*.jpg;*.png;";
            ofd.FilterIndex = 2;
            ofd.RestoreDirectory = true;
            Nullable<bool> result = ofd.ShowDialog();
            if (result == true)
            {
                string localFilename = ofd.FileName;
                string remoteFilename = (naamTextBox.Text + " " + DateTime.Now.ToString("yy-MM-ddTHH-mm-ss")).Replace(' ', '_') + (new System.IO.FileInfo(localFilename)).Extension;
                bool isMateriaaltype = (detailsGrid.DataContext is Materiaaltype);

                uploadProgressBar.Visibility = Visibility.Visible;
                vooruitgangLabel.Visibility = Visibility.Visible;

                //afbeelding uploaden => put this in threaded task
                TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
                Task.Factory.StartNew(() =>
                    uploadImage(localFilename,
                                remoteFilename,
                                isMateriaaltype,
                                uiScheduler)
                ).ContinueWith((task) =>
                {
                    Task.Factory.StartNew(() =>
                    {
                        vooruitgangLabel.Content = "100%";
                        uploadProgressBar.Value = 100;
                    }, CancellationToken.None, TaskCreationOptions.None, uiScheduler);

                    if (task.IsFaulted) MessageBox.Show(task.Exception.ToString());
                    else
                    {
                        //wegschrijven naar db
                        MessageBox.Show("Upload ok", "update", MessageBoxButton.OK);
                        Task.Factory.StartNew(() =>
                        {
                            if (detailsGrid.DataContext is Materiaaltype)
                            {
                                Materiaaltype m = detailsGrid.DataContext as Materiaaltype;
                                if (m.afbeelding == "")
                                    m.afbeelding = Properties.Settings.Default.IMAGES_MATERIAAL + "/" + remoteFilename;
                                else
                                    m.afbeelding = m.afbeelding + ";" + Properties.Settings.Default.IMAGES_MATERIAAL + "/" + remoteFilename;
                            }
                            else if (detailsGrid.DataContext is ToebehorenType)
                            {
                                ToebehorenType t = detailsGrid.DataContext as ToebehorenType;
                                if (t.afbeelding == "")
                                    t.afbeelding = Properties.Settings.Default.IMAGES_TOEBEHOREN + "/" + remoteFilename;
                                else
                                    t.afbeelding = t.afbeelding + ";" + Properties.Settings.Default.IMAGES_TOEBEHOREN + "/" + remoteFilename;
                            }

                            mm.OpslaanWijzigingen();
                        }, CancellationToken.None, TaskCreationOptions.None, uiScheduler);
                    }
                });
            }
        }

        private void uploadImage(string localFilename, string remoteFilename, Boolean isMateriaal, TaskScheduler uiScheduler)
        {
            
            #region ftp config
            OpenFTP.FTP f = new OpenFTP.FTP();
            f.Connect(Properties.Settings.Default.FTP_HOSTNAME, Properties.Settings.Default.FTP_USERNAME, Properties.Settings.Default.FTP_PASSWORD);
            if (isMateriaal)
                f.ChangeDirectory(Properties.Settings.Default.FTP_BASEPATH + Properties.Settings.Default.IMAGES_MATERIAAL);
            else
                f.ChangeDirectory(Properties.Settings.Default.FTP_BASEPATH + Properties.Settings.Default.IMAGES_TOEBEHOREN);
            #endregion
            f.Files.Upload(remoteFilename, localFilename);
            
            while (!f.Files.UploadComplete)
            {
                
                Task.Factory.StartNew(() =>
                {
                    //Totaal aantal Bytes: " +  f.Files.TotalBytes.ToString()
                    vooruitgangLabel.Content = f.Files.PercentComplete.ToString() + "%";
                    uploadProgressBar.Value = f.Files.PercentComplete;

                }, CancellationToken.None, TaskCreationOptions.None, uiScheduler);
            }
            
            f.Disconnect();
            f = null;
        }

        private void deleteButton_Click(object sender, RoutedEventArgs e)
        {
            if (materiaalDatagrid.SelectedItem != null && materiaalDatagrid.SelectedItem is Materiaal)
            {
                if (!mm.TryDeleteMateriaal(materiaalDatagrid.SelectedItem as Materiaal)) MessageBox.Show("Oeps kan het object niet verwijderen", "Foutje", MessageBoxButton.OK);
            }
        }
    }
}
